/*
 * PosicionesPoxy.cpp
 *
 *  Created on: 06/06/2013
 *      Author: jonathan
 */

#include "PosicionesPoxy.h"
#include <exception>
#include <iostream>
#include <map>
using namespace std;



PosicionesPoxy::PosicionesPoxy(ArchivoPunteros * arch, EnteroLargo cantListas) {
	this->archivo = arch;
	this->cantListas = cantListas;

}


void PosicionesPoxy::setOffset(PunteroPosiciones offset){
	this->offset = offset;
}
PosicionesPoxy::~PosicionesPoxy() {
	map<EnteroLargo, list<EnteroLargo>*>::iterator it;
	for (it = this->posiciones.begin(); it != posiciones.end(); ++it) {
		delete (*it).second;
	}
}
//si pedis dos veces la misma lista, chupala... exception.
list<EnteroLargo> * PosicionesPoxy::getPosiciones(EnteroLargo nroEnSecuencia){
	if(this->archivo != NULL){
		this->hacerLectura();
	}
	map<EnteroLargo, list<EnteroLargo>*>::iterator it = this->posiciones.find(nroEnSecuencia);
	//si no esta en el mapa tiro una excepcion.
	if(it == this->posiciones.end()){
		throw exception();
	}
	//Sino borro la lista del mapa y la retorno
	list<EnteroLargo>* retorno = it->second;
	this->posiciones.erase(it);
	return retorno;
}

void PosicionesPoxy::hacerLectura(){
	this->archivo->posicionar(this->offset);
	//leo todas las listas que que necesito y las pongo en el mapa.
	for(EnteroLargo i=0; i< this->cantListas; i++){
		this->posiciones.insert(pair<EnteroLargo,list<EnteroLargo>*> (i,this->archivo->leerListaPosiciones()));
	}
	this->archivo = NULL;
}
